From 2f26ac1f7c2175c12f45872f5444546942714883 Mon Sep 17 00:00:00 2001 From: "iap10@labyrinth.cl.cam.ac.uk" Date: Thu, 30 Sep 2004 14:10:21 +0000 Subject: [PATCH] bitkeeper revision 1.1159.97.2 (415c13cd5VJC1zwMGjzqOrsURvQiOQ) Move the shadow LDT test later in the pagefault handler. It's a bug fix, but I doubt anyone ever hit it. --- xen/arch/x86/traps.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index ab5236cdfb..60d7c50bf2 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -344,18 +344,6 @@ asmlinkage void do_page_fault(struct pt_regs *regs, long error_code) ASSERT_no_criticalregion(); - if ( unlikely(addr >= LDT_VIRT_START) && - (addr < (LDT_VIRT_START + (d->mm.ldt_ents*LDT_ENTRY_SIZE))) ) - { - /* - * Copy a mapping from the guest's LDT, if it is valid. Otherwise we - * send the fault up to the guest OS to be handled. - */ - off = addr - LDT_VIRT_START; - addr = d->mm.ldt_base + off; - if ( likely(map_ldt_shadow_page(off >> PAGE_SHIFT)) ) - return; /* successfully copied the mapping */ - } if ( likely(VM_ASSIST(d, VMASST_TYPE_writable_pagetables)) ) { @@ -377,6 +365,19 @@ asmlinkage void do_page_fault(struct pt_regs *regs, long error_code) (addr < PAGE_OFFSET) && shadow_fault(addr, error_code) ) return; /* Returns TRUE if fault was handled. */ + if ( unlikely(addr >= LDT_VIRT_START) && + (addr < (LDT_VIRT_START + (d->mm.ldt_ents*LDT_ENTRY_SIZE))) ) + { + /* + * Copy a mapping from the guest's LDT, if it is valid. Otherwise we + * send the fault up to the guest OS to be handled. + */ + off = addr - LDT_VIRT_START; + addr = d->mm.ldt_base + off; + if ( likely(map_ldt_shadow_page(off >> PAGE_SHIFT)) ) + return; /* successfully copied the mapping */ + } + if ( unlikely(!(regs->xcs & 3)) ) goto xen_fault; -- 2.30.2